package com.qf.base.utils;

import java.lang.reflect.Field;

/**
 * 用于实体类对象之间的数据拷贝
 */
public class PropertiesUtil {
    /**
     *  指定成员赋值属性
     * @param source    源对象
     * @param target       目标对象
     * @param a                用于说明第四个参数指定的成员名是用于  指定成员是否屏蔽
     * @param fieldNames    指定一组成员名
     */
    public static void copy(Object source,Object target,boolean a,String...fieldNames){
        if (a){
            for (int i=0;i<fieldNames.length;i++){
                try {

                    Field sourceField = source.getClass().getDeclaredField(fieldNames[i]);
                    Field targetField = target.getClass().getDeclaredField(fieldNames[i]);
                    sourceField.setAccessible(true);
                    targetField.setAccessible(true);
                    targetField.set(target,sourceField.get(source));
                } catch (NoSuchFieldException|IllegalAccessException e) {
//                    e.printStackTrace();
                    continue;
                }
            }
        }else {
                //指定的fieldNames都是不需要赋值的成员
                //先拿到源对象的所有成员
            Field [] sourceFields=source.getClass().getDeclaredFields();
            for (int i = 0; i < sourceFields.length; i++) {
                sourceFields[i].setAccessible(true);
                String fieldName=sourceFields[i].getName();
                if(inStringArray(fieldName,fieldNames)){
                    continue;
                }else{
                    Field targetField= null;
                    try {
                        targetField = target.getClass().getDeclaredField(fieldName);
                        targetField.setAccessible(true);
                        targetField.set(target,sourceFields[i].get(source));
                    } catch (NoSuchFieldException | IllegalAccessException e) {
                        //e.printStackTrace();
                        continue;
                    }
                }
            }

        }

    }
    private static  boolean inStringArray(String str,String [] array){
        for (int i = 0; i < array.length; i++) {
            if(str.equals(array[i])){
                return true;
            }
        }
        return false;
    }







    /***  这个是两个对象简单赋值属性的方法
     * @Author 67517
     * @Description //TODO
     * @Param [source, target]源对象和目标对象
     * @return void
     */

    public static void copy(Object source,Object target){
//        获取源对象的class
        Class<?> sourceClass=source.getClass();
//        获取目标对象的class
        Class<?> targetClass=target.getClass();
//          拿到所有成员集合
        Field[] sourceField = sourceClass.getDeclaredFields();
//        Field[] declaredFields = targetClass.getDeclaredFields();

        for (int i=0;i<sourceField.length;i++){
            Field field=sourceField[i];
//            设置可见性
            field.setAccessible(true);
            String name = field.getName();
            Field targeField=null;
            try {
                targeField=targetClass.getDeclaredField(name);
            } catch (NoSuchFieldException e) {
//                e.printStackTrace();
            }
            if (targeField==null){
                continue;
            }
            targeField.setAccessible(true);
            try {
                targeField.set(target,field.get(source));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }



    }





}
